//一行代码完成结构加赋值
let people = { name: null, age: null }
let result = { name: '张三', age: 16 }
console.log({ result });//不加这行会报错 Cannot access 'result' before initialization
({ name: people.name, age: people.age } = result)
console.log({ people });

//对基础数据类型进行解构
const { length: a } = '12345'
console.log({ a });

//对数组解构快速拿到最后一项值
const arr = [1, 2, 3, 5]
const { 0: first, length, [length - 1]: last } = arr
console.log({ first })
console.log({ length })
console.log({ last })

//将下标转为中文零一二三
function transfromNumber(number) {
    const INDEX_MAP = ['零', '一', '二', '三', '四', '五']
    if (!number)
        return
    if (number === 10)
        return INDEX_MAP[number]
    return [...number].reduce((pre, cur) => pre + INDEX_MAP[cur], '')
}
const cNumber = transfromNumber([1, 2, 3, 4, 5])
console.log({ cNumber });

//判断整数的不同方法
/* 1.任何整数都会被1整除，即余数是0。利用这个规则来判断是否是整数。但是对字符串不准确 */
function isInteger(obj) {
    return typeof obj === 'number' && obj % 1 === 0
}

/* 2. 使用Math.round、Math.ceil、Math.floor判断 整数取整后还是等于自己。利用这个特性来判断是否是整数*/
function isInteger(obj) {
    return Math.floor(obj) === obj
}

/* 3. 通过parseInt判断 某些场景不准确 */
function isInteger(obj) {
    return parseInt(obj, 10) === obj
}

/* 4. 通过位运算符*/
function isInteger(obj) {
    return (obj | 0) === obj
}

/* 5.ES6提供了Number.isInteger */
function isInteger(obj) {
    return Number.isInteger(obj)
}

/*数组随机打乱顺序**/
function shuffle(arr) {
    const { lenght } = arr
    for (let i = lenght - 1; i > 0; i--) {
        const randomIndex = Math.floor(Math.random() * (i + 1))
        [arr[i], arr[randomIndex]] = [arr[randomIndex], arr[i]]
    }
}

/**随机获取一个Boolean值,
 *Math.random() 的区间是0-0.99，用0.5在中间百分之五十的概率 */
function randomBool() {
    return 0.5 - Math.random()
}

/**把数组第一项移到最后一项 */
function startToLast(arr) {
    return arr.push(arr.shift())
}

/**把数组最后一项移到第一项 */
function lastToFirst(arr) {
    return arr.unshift(arr.pop())
}

/**利用set数组去重 */
function uniqueArr(arr) {
    return [...new Set(arr)]
}

/**获取随机颜色 */
function getRandomColor() {
    return `#${Math.floor(Math.random() * 0xffffff).toString(16)}`
}

/**
 * 检测是否为空对象
 * 使用Es6的Reflect静态方法判断他的长度就可以判断是否是空数组了，
 * 也可以通过**Object.keys()**来判断
 */
function isEmpty(obj) {
    return Reflect.ownKeys(obj).length === 0 && obj.constructor === Object
}

/**Boolean转换 */
function toBoolean(value, truthyValues = ['true']) {
    const normalizedValue = String(value).toLowerCase().trim()
    return truthyValues.includes(value)
}
toBoolean('TRUE') //true
toBoolean('FALSE') //false
toBoolean('YES', ["yes"]) //true

/**各种克隆数组 */
const clone1 = (arr) => arr.slice(0)
const clone2 = (arr) => [...arr]
const clone3 = (arr) => Array.from(arr)
const clone4 = (arr) => arr.map((x) => x)
const clone5 = (arr) => JSON.parse(JSON.stringify(arr))
const clone6 = (arr) => arr.concat([])
const clone7 = (arr) => structuredClone(arr)

/**比较两个时间 */
function compareTime(t1, t2) {
    return t1.getTime() > b.getTime()
}

/**计算两个时间之间的月份差异 */
function monthDiff(startDate, endDate) {
    return Math.max(0, (endDate.getFullYear() - startDate.getFullYear()) * 12 - startDate.getMonth() + endDate.getMonth());
}

/**
 * 一步从时间中提取年月日时分秒
 *由于toISOString会丢失时区，导致时间差八小时，所以在格式化之前加上八个小时
 */
 function extract(date){
    const d = new Date(new Date(date).getTime() + 8*3600*1000);
   return new Date(d).toISOString().split(/[^0-9]/).slice(0, -1);
 }
 console.log(extract(new Date())) // ['2022', '09', '19', '18', '06', '11', '187']

 /**判断一个参数是不是函数 */
 function isFunction(v){
    return ['[object Function]', '[object GeneratorFunction]', '[object AsyncFunction]', '[object Promise]'].includes(Object.prototype.toString.call(v));
 }

 /**判断是否是NodeJs环境 */
 function isNode(){
    return typeof process !== 'undefined' && process.versions != null && process.versions.node != null;
}